#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int n;
inline bool myRead(int &r){
  r=0;
  for(int i=0;i<n;i++){
    char c;
    while((c=getchar())!='0'&&c!='1');
    r<<=1;
    if(c=='1') r|=1;
  }
  char c;
  while((c=getchar())!='0'&&c!='1');
  return c=='1';
}

inline void read(int &r){
  char c;bool f=0;
  for(c=getchar();c>'9'||c<'0';c=getchar()) if(c=='-') f=1;
  for(r=0;c<='9'&&c>='0';c=getchar()) r=r*10+c-'0';
  if(f) r=-r;
}

const int mxend=1<<20;
int f[mxend];
int change[mxend],cnt,end;
long long ans;

void dfs(int p);

int main(){
  int m;

  freopen("MaxCut.in","r",stdin);
  freopen("MaxCut.out","w",stdout);

  read(n);read(m);
  end=1<<n;
  memset(f,-1,sizeof f);
  for(int i=0;i<m;i++){
    int t;bool x;
    x=myRead(t);
    f[t]=x;
  }
  for(int mask=0;mask<end;mask++){
    if(f[mask]==-1) continue;
    if(f[mask])
      for(int t=1;t<end;t<<=1) f[mask|t]=1;
    else{ 
      for(int k=mask&(mask-1);k;k=mask&(k-1)) f[k]=0;
      f[0]=0;
    }
  }

  //for(int mask=0;mask<end;mask++) printf("%d %d\n",mask,f[mask]);
  cnt=0;
  for(int mask=0;mask<end;mask++) if(f[mask]==-1) change[cnt++]=mask;
  ans=0;
  dfs(0);
  printf("%.18f\n",double(ans)/n/(1<<n));

  return 0;
}

inline void checkAns();
void dfs(int p){
  //printf("dfs(%d)\n",p);
  if(p==cnt) checkAns();
  else{
    f[change[p]]=0;
    dfs(p+1);
    f[change[p]]=1;
    dfs(p+1);
  }
}

inline void checkAns(){
  for(int i=0;i<end;i++){
    if(f[i]){
      for(int j=1;j<end;j<<=1) if(!f[i|j]) return;
    }else{
      for(int j=i&(i-1);j;j=i&(j-1)) if(f[j]) return;
      if(f[0]) return;
    }
  }
  long long c;
  c=0;
  for(int i=0;i<end;i++)
    for(int j=1;j<end;j<<=1)
      if(f[i^j]!=f[i]) c++;
  //for(int i=0;i<end;i++) printf("f[%d]=%d\n",i,f[i]);
  //printf("c=%lld\n",c);
  if(c>ans) ans=c;
}
